{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import missingno as msno\n",
    "\n",
    "from scipy import stats\n",
    "from matplotlib import pyplot as plt\n",
    "\n",
    "# Suppress warnings from pandas\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "plt.style.use('seaborn')\n",
    "plt.rcParams['font.family'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%store -r origin_data\n",
    "%store -r samples_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "样本编号                     Unnamed: 0_level_1         285\n",
       "S-ZORB.CAL_H2.PV         氢油比                   0.273399\n",
       "S-ZORB.PDI_2102.PV       反应过滤器压差                24.2082\n",
       "S-ZORB.PT_2801.PV        还原器压力                  2.52887\n",
       "S-ZORB.FC_2801.PV        还原器流化氢气流量              855.883\n",
       "S-ZORB.TE_2103.PV        反应器上部温度                421.509\n",
       "S-ZORB.TE_2005.PV        反应器底部温度                421.196\n",
       "S-ZORB.PT_2101.PV        反应器顶部压力                2.42709\n",
       "S-ZORB.PDT_2104.PV       反应器顶底压差                 59.703\n",
       "S-ZORB.SIS_PDT_2103B.PV  反应过滤器压差                1108.29\n",
       "Name: 284, dtype: object"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# No.285 样本\n",
    "sample_285 = samples_data.iloc[284]\n",
    "sample_285 = sample_285.drop(index=sample_285.index[[x for x in range(1, 16)]], axis=1)\n",
    "\n",
    "# 查看 No.285 数据情况\n",
    "sample_285.iloc[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "样本编号                     Unnamed: 0_level_1         313\n",
       "S-ZORB.CAL_H2.PV         氢油比                   0.261936\n",
       "S-ZORB.PDI_2102.PV       反应过滤器压差                17.1835\n",
       "S-ZORB.PT_2801.PV        还原器压力                  2.41706\n",
       "S-ZORB.FC_2801.PV        还原器流化氢气流量              850.301\n",
       "S-ZORB.TE_2103.PV        反应器上部温度                424.969\n",
       "S-ZORB.TE_2005.PV        反应器底部温度                424.522\n",
       "S-ZORB.PT_2101.PV        反应器顶部压力                 2.3159\n",
       "S-ZORB.PDT_2104.PV       反应器顶底压差                61.7014\n",
       "S-ZORB.SIS_PDT_2103B.PV  反应过滤器压差                1250.69\n",
       "Name: 312, dtype: object"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# No.313 样本\n",
    "sample_313 = samples_data.iloc[312]\n",
    "sample_313 = sample_313.drop(index=sample_313.index[[x for x in range(1, 16)]], axis=1)\n",
    "\n",
    "# 查看 No.313 数据情况\n",
    "sample_313.iloc[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def find_dummy_colmuns(sample):\n",
    "    dummy_columns = []\n",
    "    for (code_name, i18n_name) in sample.keys():\n",
    "        if not sample[(code_name, i18n_name)]:\n",
    "            dummy_columns.append(code_name)\n",
    "    return dummy_columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "No.285 属性值为空的列: ['S-ZORB.FT_1501.PV', 'S-ZORB.FT_1002.PV', 'S-ZORB.FC_1202.PV', 'S-ZORB.FT_1501.TOTAL', 'S-ZORB.FT_5102.PV', 'S-ZORB.FT_2901.DACA', 'S-ZORB.FC_1104.DACA', 'S-ZORB.FT_2803.DACA', 'S-ZORB.FT_1502.DACA', 'S-ZORB.TEX_3103A.DACA', 'S-ZORB.FT_5102.DACA.PV']\n"
     ]
    }
   ],
   "source": [
    "sample_285_dummy_columns = find_dummy_colmuns(sample_285)\n",
    "# 查看 No.285 属性值为空的情况\n",
    "print(f\"No.285 属性值为空的列: {sample_285_dummy_columns}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "No.313 属性值为空的列: ['S-ZORB.FT_1501.PV', 'S-ZORB.FT_1002.PV', 'S-ZORB.FT_1501.TOTAL', 'S-ZORB.FT_2901.DACA', 'S-ZORB.FC_1104.DACA', 'S-ZORB.FT_2803.DACA', 'S-ZORB.FT_1502.DACA', 'S-ZORB.TEX_3103A.DACA']\n"
     ]
    }
   ],
   "source": [
    "# 查看 No.313 属性值为空的情况\n",
    "sample_313_dummy_columns = find_dummy_colmuns(sample_313)\n",
    "print(f\"No.313 属性值为空的列: {sample_313_dummy_columns}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "拆分出来的285号样本的原始数据\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>S-ZORB.FT_1501.PV</th>\n",
       "      <th>S-ZORB.FT_1002.PV</th>\n",
       "      <th>S-ZORB.FC_1202.PV</th>\n",
       "      <th>S-ZORB.FT_1501.TOTAL</th>\n",
       "      <th>S-ZORB.FT_5102.PV</th>\n",
       "      <th>S-ZORB.FT_2901.DACA</th>\n",
       "      <th>S-ZORB.FC_1104.DACA</th>\n",
       "      <th>S-ZORB.FT_2803.DACA</th>\n",
       "      <th>S-ZORB.FT_1502.DACA</th>\n",
       "      <th>S-ZORB.TEX_3103A.DACA</th>\n",
       "      <th>S-ZORB.FT_5102.DACA.PV</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>新氢进装置流量</th>\n",
       "      <th>1#催化汽油进装置流量</th>\n",
       "      <th>D121顶去放火炬流量</th>\n",
       "      <th>新氢进装置流量</th>\n",
       "      <th>0</th>\n",
       "      <th>D-109松动风流量</th>\n",
       "      <th>进料调节阀旁路流量</th>\n",
       "      <th>紧急氢气去D-102流量</th>\n",
       "      <th>补充氢压缩机出口返回管流量</th>\n",
       "      <th>EH-102加热元件/A束温度</th>\n",
       "      <th>D-201含硫污水排量</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  S-ZORB.FT_1501.PV S-ZORB.FT_1002.PV S-ZORB.FC_1202.PV S-ZORB.FT_1501.TOTAL  \\\n",
       "            新氢进装置流量       1#催化汽油进装置流量       D121顶去放火炬流量              新氢进装置流量   \n",
       "0               0.0               0.0               0.0                  0.0   \n",
       "1               0.0               0.0               0.0                  0.0   \n",
       "2               0.0               0.0               0.0                  0.0   \n",
       "3               0.0               0.0               0.0                  0.0   \n",
       "4               0.0               0.0               0.0                  0.0   \n",
       "\n",
       "  S-ZORB.FT_5102.PV S-ZORB.FT_2901.DACA S-ZORB.FC_1104.DACA  \\\n",
       "                  0          D-109松动风流量           进料调节阀旁路流量   \n",
       "0               0.0                 0.0                 0.0   \n",
       "1               0.0                 0.0                 0.0   \n",
       "2               0.0                 0.0                 0.0   \n",
       "3               0.0                 0.0                 0.0   \n",
       "4               0.0                 0.0                 0.0   \n",
       "\n",
       "  S-ZORB.FT_2803.DACA S-ZORB.FT_1502.DACA S-ZORB.TEX_3103A.DACA  \\\n",
       "         紧急氢气去D-102流量       补充氢压缩机出口返回管流量       EH-102加热元件/A束温度   \n",
       "0                 0.0                 0.0                   0.0   \n",
       "1                 0.0                 0.0                   0.0   \n",
       "2                 0.0                 0.0                   0.0   \n",
       "3                 0.0                 0.0                   0.0   \n",
       "4                 0.0                 0.0                   0.0   \n",
       "\n",
       "  S-ZORB.FT_5102.DACA.PV  \n",
       "             D-201含硫污水排量  \n",
       "0                    0.0  \n",
       "1                    0.0  \n",
       "2                    0.0  \n",
       "3                    0.0  \n",
       "4                    0.0  "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据在样本数据中缺失值的属性列，拆分原始数据中285号样本的数据\n",
    "print(\"拆分出来的285号样本的原始数据\")\n",
    "raw_285 = origin_data.iloc[:40]\n",
    "raw_285[sample_285_dummy_columns].head(n=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "拆分出来的313号样本的原始数据\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>S-ZORB.FT_1501.PV</th>\n",
       "      <th>S-ZORB.FT_1002.PV</th>\n",
       "      <th>S-ZORB.FT_1501.TOTAL</th>\n",
       "      <th>S-ZORB.FT_2901.DACA</th>\n",
       "      <th>S-ZORB.FC_1104.DACA</th>\n",
       "      <th>S-ZORB.FT_2803.DACA</th>\n",
       "      <th>S-ZORB.FT_1502.DACA</th>\n",
       "      <th>S-ZORB.TEX_3103A.DACA</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>新氢进装置流量</th>\n",
       "      <th>1#催化汽油进装置流量</th>\n",
       "      <th>新氢进装置流量</th>\n",
       "      <th>D-109松动风流量</th>\n",
       "      <th>进料调节阀旁路流量</th>\n",
       "      <th>紧急氢气去D-102流量</th>\n",
       "      <th>补充氢压缩机出口返回管流量</th>\n",
       "      <th>EH-102加热元件/A束温度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   S-ZORB.FT_1501.PV S-ZORB.FT_1002.PV S-ZORB.FT_1501.TOTAL  \\\n",
       "             新氢进装置流量       1#催化汽油进装置流量              新氢进装置流量   \n",
       "41               0.0               0.0                  0.0   \n",
       "42               0.0               0.0                  0.0   \n",
       "43               0.0               0.0                  0.0   \n",
       "44               0.0               0.0                  0.0   \n",
       "45               0.0               0.0                  0.0   \n",
       "\n",
       "   S-ZORB.FT_2901.DACA S-ZORB.FC_1104.DACA S-ZORB.FT_2803.DACA  \\\n",
       "            D-109松动风流量           进料调节阀旁路流量        紧急氢气去D-102流量   \n",
       "41                 0.0                 0.0                 0.0   \n",
       "42                 0.0                 0.0                 0.0   \n",
       "43                 0.0                 0.0                 0.0   \n",
       "44                 0.0                 0.0                 0.0   \n",
       "45                 0.0                 0.0                 0.0   \n",
       "\n",
       "   S-ZORB.FT_1502.DACA S-ZORB.TEX_3103A.DACA  \n",
       "         补充氢压缩机出口返回管流量       EH-102加热元件/A束温度  \n",
       "41                 0.0                   0.0  \n",
       "42                 0.0                   0.0  \n",
       "43                 0.0                   0.0  \n",
       "44                 0.0                   0.0  \n",
       "45                 0.0                   0.0  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据在样本数据中缺失值的属性列，拆分原始数据中313号样本的数据\n",
    "print(\"拆分出来的313号样本的原始数据\")\n",
    "raw_313 = origin_data.iloc[41:]\n",
    "raw_313[sample_313_dummy_columns].head(n=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[]\n"
     ]
    }
   ],
   "source": [
    "# 计算 No.285 样本 上述缺失属性集合中 属性值存在 缺失率，并输出缺失率不超过 阈值的列名\n",
    "dummy_285 = raw_285[sample_285_dummy_columns]\n",
    "dummy_285_nonzeroratio = dummy_285.astype(bool).sum(axis=0) / dummy_285.shape[0]\n",
    "nodummy_285_columns = []\n",
    "for (code_name, i18n_name) in dummy_285_nonzeroratio.keys():\n",
    "    if dummy_285_nonzeroratio[(code_name, i18n_name)] >= 0.9:\n",
    "        nodummy_285_columns.append(code_name)\n",
    "print(nodummy_285_columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[]\n"
     ]
    }
   ],
   "source": [
    "# 计算 No.313 样本 上述缺失属性集合中 属性值存在 缺失率，并输出缺失率不超过 阈值的列名\n",
    "dummy_313 = raw_313[sample_313_dummy_columns]\n",
    "dummy_313_nonzeroratio = dummy_313.astype(bool).sum(axis=0) / dummy_313.shape[0]\n",
    "nodummy_313_columns = []\n",
    "for (code_name, i18n_name) in dummy_313_nonzeroratio.keys():\n",
    "    if dummy_313_nonzeroratio[(code_name, i18n_name)] >= 0.9:\n",
    "        nodummy_313_columns.append(code_name)\n",
    "print(nodummy_313_columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 缺失率 $r_1$\n",
    "missing_ratio1 = 0.9  # 可调参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[]\n"
     ]
    }
   ],
   "source": [
    "# 计算 No.285 样本 其余属性的 缺失率，并记录存在缺失的 属性名\n",
    "raw_285 = raw_285.drop(raw_285[sample_285_dummy_columns], axis=1)\n",
    "raw_285_nonzeroratio = raw_285.astype(bool).sum(axis=0) / raw_285.shape[0]\n",
    "raw_285_dummy_columns = []\n",
    "raw_313_delete_columns = []\n",
    "for (code_name, i18n_name) in raw_285_nonzeroratio.keys():\n",
    "    if raw_285_nonzeroratio[(code_name, i18n_name)] != 1.0:\n",
    "        raw_285_dummy_columns.append(code_name)\n",
    "        if raw_285_nonzeroratio[(code_name, i18n_name)] <= missing_ratio1:\n",
    "            raw_285_dummy_columns.append(code_name)\n",
    "        print(f\"{(code_name, i18n_name)} => {raw_285_nonzeroratio[(code_name, i18n_name)]}\")\n",
    "print(raw_285_dummy_columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "No.285 样本数据 修正 属性值个数 => 240\n"
     ]
    }
   ],
   "source": [
    "# 依据 拉依达准则 对 No.285 样本进行属性值数据修正\n",
    "raw_285_filter = raw_285.replace(0, np.NaN)\n",
    "raw_285_filter_describe = raw_285_filter.describe()\n",
    "fix_count = 0\n",
    "try:\n",
    "    for (code_name, i18n_name) in raw_285_filter.keys()[2:]:\n",
    "        norm_test = stats.kstest(raw_285_filter[(code_name, i18n_name)], 'norm', (raw_285_filter_describe.loc['mean', (code_name, i18n_name)], raw_285_filter_describe.loc['std', (code_name, i18n_name)]))\n",
    "        if norm_test.pvalue > 0.05:\n",
    "            temp_data = raw_285_filter[(code_name, i18n_name)][np.abs(raw_285_filter[(code_name, i18n_name)] - raw_285_filter_describe.loc['mean', (code_name, i18n_name)]) <= 3 * raw_285_filter_describe.loc['std', (code_name, i18n_name)]]\n",
    "            if sample_285[(code_name, i18n_name)] != round(temp_data.mean(), 7):\n",
    "                # print(f\"{'='*10} code_name: {(code_name, i18n_name)} {'='*10}\")\n",
    "                sample_285[(code_name, i18n_name)] = round(temp_data.mean(), 7)\n",
    "                # print(f\"样本数据 修正 => {sample_285[(code_name, i18n_name)]}\")\n",
    "                fix_count += 1\n",
    "                # print(f\"{'='*40}\")\n",
    "except RuntimeWarning:\n",
    "    pass\n",
    "print(f\"No.285 样本数据 修正 属性值个数 => {fix_count}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('S-ZORB.FT_1204.PV', 0) => 0.95\n",
      "('S-ZORB.FC_2432.DACA', 'D-106热氮气流量') => 0.6\n",
      "('S-ZORB.FT_2431.DACA', 0) => 0.85\n",
      "('S-ZORB.FC_2432.PIDA.SP', '3.0步骤FIC2432.SP') => 0.6\n",
      "('S-ZORB.FT_1204.DACA.PV', 'D-121含硫污水排量') => 0.95\n",
      "['S-ZORB.FT_1204.PV', 'S-ZORB.FC_2432.DACA', 'S-ZORB.FT_2431.DACA', 'S-ZORB.FC_2432.PIDA.SP', 'S-ZORB.FT_1204.DACA.PV']\n"
     ]
    }
   ],
   "source": [
    "# 统计 No.313 样本 中属性中属性值存在空值的属性\n",
    "raw_313 = raw_313.drop(raw_313[sample_313_dummy_columns], axis=1)\n",
    "raw_313_nonzeroratio = raw_313.astype(bool).sum(axis=0) / raw_313.shape[0]\n",
    "raw_313_dummy_columns = []\n",
    "raw_313_delete_columns = []\n",
    "for (code_name, i18n_name) in raw_313_nonzeroratio.keys():\n",
    "    if raw_313_nonzeroratio[(code_name, i18n_name)] != 1.0:\n",
    "        raw_313_dummy_columns.append(code_name)\n",
    "        if raw_313_nonzeroratio[(code_name, i18n_name)] <= missing_ratio1:\n",
    "            raw_313_delete_columns.append(code_name)\n",
    "        print(f\"{(code_name, i18n_name)} => {raw_313_nonzeroratio[(code_name, i18n_name)]}\")\n",
    "print(raw_313_dummy_columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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7LHHHnzta19zw8opZNFbkiRJkiRJkir2zjvvcMkll3Dttdcyfvx4FlxwQQYPHszqq69Oe3t71eE1FIvekiRJkiRJklSRDz74gMsvv5wrrriCsWPHMs8887Drrruy9tpr06tXr6rDa0gWvSVJkiRJkiSph3388cdce+21XHLJJYwZM4Y55piDPfbYgw033JC+fftWHV5Ds+gtSZIkSZIkST1k/Pjx3HjjjVx44YW8+eabzDLLLOyxxx5svvnm9OvXr+rwmoJFb0mSJEmSJEmaziZOnMjw4cM577zzeOWVV5hxxhnZYYcd2Gabbejfv3/V4TUVi96SJEmSJEmSNJ10dHRwxx13MGzYMJ577jn69OnD5ptvzg477MCcc85ZdXhNyaK3pOlm3nnnBWDEiBHVBiJpuhs1alTVIUjqAY7tUutwbJek7vHCCy8wZMgQHn/8cdrb21lvvfXYeeed/3tdpenDorckSZIkSZIkTQd33HEHjz/+OACrr746++yzj61MekB71QFIkiRJkiRJUjPaaqut+PGPf8xcc83F7bffznbbbcdFF13E2LFjqw6tqVn0liRJkiRJkqTpoHfv3my88cZcfPHFfO9736NXr14MGzaMHXbYgauuuopx48ZVHWJTsugtSZIkSZIkSdPRDDPMwDbbbMMll1zCLrvswkcffcQZZ5zBzjvvzA033MDEiROrDrGpWPSWJEmSJEmSpB4w88wzs+uuu3LppZey9dZb8/bbb3PKKaew2267cdtttzFp0qSqQ2wKFr0lSZIkSZIkqQfNNtts7LPPPlx88cVstNFGvPLKKxx77LHsvffe3H333XR0dFQdYkOz6C1JkiRJkiRJFRgwYAA/+clPOP/88/nOd77D008/zaGHHsr+++/Pww8/XHV4DcuityRJkiRJkiRVaP755+fwww/n7LPPZrXVVmPkyJHsv//+HHLIIWRm1eE1nN5VByBJkiRJkiRJgkUXXZTjjz+exx57jLPPPpt77rmHe+65hzXWWIPddtuNhRZaqOoQG4IzvSVJkiRJkiSpjnz5y1/mtNNO49RTT2WppZbi9ttvZ/fdd+fnP/85o0aNqjq8uudMb0mSJEmSJEmqQyuuuCJf/epXueOOOzjnnHO46aabuOWWW9hoo43YcccdmXPOOasOsS5Z9JY03XQ+edx2220rjkTS9HTZZZdVHYKkHuLYLrUGx3ZJqi9tbW1885vfZJVVVmH48OGcd955XHPNNdxwww1sscUWbLvttvTv37/qMOuK7U0kSZIkSZIkqc716tWLtddem/PPP58f//jH9O/fn0suuYRddtmFsWPHVh1eXbHoLUmSJEmSJEkNonfv3my88cZcdNFFrLDCCowePZp333236rDqikVvSZIkSZIkSWowM8wwAwMGDKg6jLpk0VuSJEmSJEmS1DQsekuSJEmSJEmSmoZFb0mSJEmSJElS07DoLUmSJEmSJElqGha9JUmSJEmSJElNw6K3JEmSJEmSJKlpWPSWJEmSJEmSJDUNi96SJEmSJEmSpKZh0VuSJEmSJEmS1DQsekuSJEmSJEmSmoZFb0mSJEmSJElS07DoLUmSJEmSJElqGha9JUmSJEmSJElNw6K3JEmSJEmSJKlpWPSWJEmSJEmSJDUNi96SJEmSJEmSpKZh0VuSJEmSJEmS1DQsekuSJEmSJEmSmoZFb0mSJEmSJElS07DoLUmSJEmSJElqGha9JUmSJEmSJElNw6K3JEmSJEmSJKlpWPSWJEmSJEmSJDUNi96SJEmSJEmSpKZh0VuSJEmSJEmS1DQsekuSJEmSJEmSmoZFb0mSJEmSJElS07DoLUmSJEmSJElqGha9JUmSJEmSJElNw6K3JEmSJEmSJKlpWPSWJEmSJEmSJDUNi96SJEmSJEmSpKZh0VuSJEmSJEmS1DQsekuSJEmSJEmSmoZFb0mSJEmSJElS07DoLUmSJEmSJEkN5o033uChhx6ira2Nfv36VR1OXbHoLUmSJEmSJEkN5O233+aAAw7gtddeY9ddd2W22WarOqS6YtFbkiRJkiRJkhrEmDFjOOigg3jxxRfZdttt2WmnnaoOqe5Y9JYkSZIkSZKkBvDBBx9wyCGH8Mwzz7Dpppuy11570dbWVnVYdceityRJkiRJkiTVubFjx3LooYfy+OOPs+6667Lvvvta8P4EFr0lSZIkSZIkqY6NGzeOI488kpEjR7Lmmmty4IEH0t5uafeT+G9GkiRJkiRJkurUhAkTOOaYY7jvvvtYddVVOfzww+nVq1fVYdU1i96SJEmSJEmSVIcmTpzIkCFDuPPOO1lxxRU56qij6N27d9Vh1T2L3pIkSZIkSZJUZyZNmsTQoUMZPnw4X/nKVzjuuOPo27dv1WE1BIvekiRJkiRJklRHOjo6OOOMM7jxxhuJCIYMGUK/fv2qDqthOBdekiRNs3nnnZcRI0ZUHYak6WzUqFFVhyBJktQSzj77bK655hoWWWQRfv7znzPLLLNUHVJDcaa3JEmSJEmSJNWJiy66iEsuuYQFFliAU089ldlmm63qkBqORW9JkiRJkiRJqgPDhw9n2LBhzDPPPAwdOpQ555yz6pAakkVvSZIkSZIkSaoDH330EQB9+/alT58+FUfTuCx6S5IkSZIkSVIdWG+99dhmm2148cUXOfDAAxkzZkzVITUki96SJEmSJEmSVAfa2trYe++92XjjjXnmmWc45JBD+OCDD6oOq+FY9JYkSZIkSZKkOtHW1sb+++/POuusw+OPP85hhx3237YnmjIWvSVJkiRJkiSpjrS3t3PQQQexxhpr8PDDD3PEEUcwbty4qsNqGBa9JUmSJEmSJKnO9OrVi8MPP5xvfOMb3HfffRx77LFMmDCh6rAagkVvSZIkSZIkSapDffr04ZhjjmGFFVbgjjvu4KSTTmLixIlVh1X3LHpLkiRJkiRJUp3q27cvJ5xwAksvvTS33norv/jFL+jo6Kg6rLpm0VuSJEmSJEmS6li/fv046aSTWGKJJfjLX/7CGWecYeH7U/SuOgBJktT4Ro0axbbbblt1GJKms8suu6zqECRJklrWLLPMwimnnMKPfvQjrr76amaaaSYGDx5cdVh1yZnekiRJkiRJktQAZpttNk499VTmn39+LrroIi6++OKqQ6pLFr0lSZIkSZIkqUHMNddcDB06lHnmmYezzz6bq666quqQ6o5Fb0mSJEmSJElqEGPGjOHee++lf//+AJx55pmMHz++4qjqiz29JUmSJEmSJKmOjR07ljvvvJPhw4dzzz33MGHCBACWWWYZNt10U/r06VNxhPXForckSZIkSZIk1Znx48dz7733cuutt3LnnXfy0UcfAbD44ouz1lprsdZaazHPPPNUHGV9sugtSZIkSZIkSXVg4sSJjBw5kltuuYW///3vvPfeewDMP//8rLXWWgwaNIiFFlqo4ijrn0VvSZIkSZIkSapIR0cHTzzxBLfccgsjRozgzTffBIoNK7fccksGDRpERNDW1lZxpI3DorckSZIkSZIk9bAXXniBW2+9lVtvvZWXX34ZgP79+7PBBhswaNAgll12WXr16lVxlI3JorckSZIkSZIk9YDXX3+d4cOHc+utt/LUU08BMOOMM/63dcnXvvY1N6XsBha9JUmSJEmSJGk6effddxkxYgTDhw/n4YcfBqBXr16sssoqDBo0iFVXXZV+/fpVHGVzsegtSZIkSZIkSd3oww8/5J///CfDhw/n3nvvZdKkSbS1tbH88sszaNAgvvWtbzHrrLNWHWbTsugtabqZd955ARgxYkS1gUjqEea61DrMd6n5jRo1quoQJKnhjBs3jn/961/ceuut3HXXXYwbNw6AiGCttdbi29/+NgMGDKg4ytZg0VuSJEmSJEmSpsLEiRN58MEHufXWW/nHP/7BBx98AMCCCy7IoEGDGDRoEAsssEDFUbYei96SJEmSJEmSNIU6Ojr4z3/+wy233MKIESMYPXo0AAMGDGDDDTdk0KBBLL744rS1tVUcaeuy6C1JkiRJkiRJU+Dhhx/mpJNO4tVXXwVg1llnZeONN2bQoEF85Stfob29veIIBRa9JUmSJEmSJGmK/OMf/+DVV19l9dVXZ4MNNmDFFVekd29LrPXG/0ckSZIkSZIk6XPYcccdWXLJJasOQ5/A+faSJEmSJEmSpKZh0VuSJEmSJEmS1DQsekuSJEmSJEmSmoZFb0mSJEmSJElS07DoLUmSJEmSJElqGha9JUmSJEmSJElNw6K3JEmSJEmSJKlpWPSWJEmSJEmSJDUNi96SJEmSJEmSpKZh0VuSJEmSJEmS1DQsekuSJEmSJEnSFOjduzcAjz76aMWR6NNY9JYkSZIkSZKkKbDeeusx66yzcsYZZzB8+PCqw9EnsOgtSZIkSZIkSVNg4MCBnHzyyfTr148TTzyRO++8s+qQNBkWvSVJkiRJkiRpCkUEQ4YMoU+fPhx99NHcf//9VYekLix6S5IkSZIkSdLnsMwyy3D88ccD8LOf/YyRI0dWHJFqWfSWJEmSJEmSpM9pxRVX5Oijj2b8+PEceuihZGbVIalk0VuSJEmSJEmSpsKqq67KYYcdxtixYzn44IN55plnqg5JWPSWJEmSJEmSpKm21lprcdBBBzFmzBgOPPBAXnzxxapDankWvSVJkiRJkiRpGqy77rrst99+jB49mgMOOIBRo0ZVHVJL6111AJIkqfGNGjWKbbfdtuowJE1nI0aMqDoESZKkurXZZpvx0UcfcdZZZ3HAAQfwy1/+ki984QtVh9WSnOktSZIkSZIkSd1gu+22Y6edduKVV17hwAMP5J133qk6pJZk0VuSJEmSJEmSusluu+3GVlttxfPPP89BBx3Ee++9V3VILceityRJkiRJkiR1k7a2NvbZZx822mgjnnrqKQ499FAmTpxYdVgtxaK3JEmSJEmSJHWjtrY2fvSjH7HSSivx6KOP8tJLL1UdUkux6C1JkiRJkiRJ3ay9vZ35558fgEmTJlUcTWux6C1JkiRJkiRJahoWvSVJkiRJkiRJTcOityRJkiRJkiSpaVj0liRJkiRJkiQ1DYvekiRJkiRJkqSmYdFbkiRJkiRJktQ0LHpLkiRJkiRJkpqGRW9JkiRJkiRJUtOw6C1JkiRJkiRJahoWvSVJkiRJkiRJTcOityRJkiRJkiRNB+3tRfn10ksv5fXXX684mtZh0VuSJEmSJEmSpoN1112XgQMH8re//Y0dd9yR3/zmN7zzzjtVh9X0LHpLkiRJkiRJ0nSw5JJLcs4553DIIYcw55xzcuWVV7L99ttzzjnn8P7771cdXtOy6C1JkiRJkiRJ00mvXr1Yd911ueCCC9hvv/2YccYZufDCC9lhhx247LLL+Oijj6oOselY9JYkSZIkSZKk6axv375sttlmXHzxxey5555MmjSJM888kx133JHrrruO8ePHVx1i07DoLUmSJEmSJEk9pF+/fmy//fZceuml7LjjjnzwwQecfvrp7LLLLtx8881MnDix6hAbnkVvSZIkSZIkSephs8wyC4MHD+biiy9miy224M0332TIkCEMHjyYf/zjH3R0dFQdYsOy6C1JkiRJkiRJFZlzzjn54Q9/yIUXXsj666/Piy++yJFHHsk+++zDfffdZ/F7KvSuOgBJzWvUqFEAbLvtthVHIml6uuyyy6oOQVIPcWyXWoNjuyRVY5555uGggw5im2224dxzz2XEiBEcdNBBLL/88gwePJivfOUrVYfYMJzpLUmSJEmSJEl1YuDAgRx11FGcddZZrLzyyvz73/9m33335bDDDuOpp56qOryG4ExvSZIkSZIkSaozSyyxBCeddBIjR47k7LPP5q677uKuu+5irbXWYtddd2XBBResOsS65UxvSZIkSZIkSapTyyyzDKeffjo///nPWWKJJRg+fDi77rorp556Kq+//nrV4dUli96SJEmSJEmSVMfa2tr4+te/zplnnsnRRx/NAgsswF/+8hd23HFHzjzzTDe77MKityRJkiRJkiQ1gLa2NtZYYw3OOeccDjnkEPr3789ll13Gm2++WXVodcWityRJkiRJkiQ1kF69erHuuuuy0korATBx4sSKI6ovFr0lSZIkSZIkSU3DorckSZIkSZIkqWlY9JYkSZIkSZIkNQ2L3pIkSZIkSZKkpmHRW5IkSZIkSZLUNCx6S5IkSZIkSZKahkVvSZIkSZIkSVLTsOgtSZIkSZIkSWoaFr0lSZIkSZIkSU3DorckSZIkSZIkqWlY9JYkSZIkSZKkBjNp0iRee+01ANra2iqOpr5Y9JYkSZIkSZKkBtLR0cHpp5/OQw89xNJLL82AAQOqDqmuWPSWJEmSJEmSpAbR0dHB7373O66//noWW2wxhgwZQnu7Zd5a/tuQJEmSJEmSpAZx3nnnccUVVzBw4EBOOeUU+vfvX3VIdceityRJkiRJkiQ1gEsvvZQLLriAL37xi5x66qnMMcccVYdUlyx6S5IkSZIkSVKdu/baaznrrLMYMGAAQ4cOtY/3p7DoLUmSJEmSJEl17KabbuKXv/wlc8wxB0OHDmXeeeetOqS6ZtFbkiRJkiRJkurUbbfd9t/e3aeeeioLLrhg1SHVvd5VByBJkhrfvPPOy4gRI6oOQ9J0NmrUqKpDkCRJail33nknJ5xwAjPOOCMnn3wyiy66aNUhNQRnekuSJEmSJElSnbn//vs5+uij6d27NyeddBJLLbVU1SE1DIvekiRJkiRJklRHRo4cyc9+9jMAjj/+eJZZZpmKI2osFr0lSZIkSZIkqU5kJoceeijjx4/nqKOOYqWVVqo6pIZj0VuSJEmSJEmS6sDzzz/PwQcfzIcffshhhx3GaqutVnVIDcmityRJkiRJkiTVgeHDhzNmzBi++tWv8u1vf7vqcBqWRW9JkiRJkiRJqgNbbLEFiy66KPfffz9nnnkmHR0dVYfUkCx6S5IkSZIkSVIdmHXWWTn11FNZcMEF+eMf/8gFF1xQdUgNyaK3JEmSJEmSJNWJOeaYg6FDhzLffPNx3nnncfnll1cdUsOx6C1JkiRJkiRJdWTAgAEMHTqUL3zhC/zud7/juuuuqzqkhmLRW5IkSZIkSZLqzHzzzcfQoUOZY445OP300/nrX/9adUgNw6K3JEmSJEmSJNWhgQMHcsopp9C/f39OPvlkbr/99qpDagi9qw5AkiQ1vlGjRrHttttWHYak6eyyyy6rOgRJkqSWs9hii3HyySdzwAEHcNxxx9G3b19WWWWVqsOqa870liRJkiRJkqQ6ttRSS3HiiSfSu3dvjjrqKB544IGqQ6prFr0lSZIkSZIkqc4tt9xyHHfccQAcfvjhPPLIIxVHVL8sekuSJEmSJElSA/ja177GkUceybhx4/jpT3/KE088UXVIdcmityRJkiRJkiQ1iG9+85scdthhfPjhhxx00EE8++yzVYdUdyx6S5IkSZIkSVIDGTRoEDvuuCNjxozhkEMOYeLEiVWHVFd6Vx2AJEmSJEmSJGnKjBo1ivPPP5+bb74ZgAUWWKDiiOqPRW9JkiRJkiRJqnNvv/02F110EX/+858ZP348Cy+8MIMHD2a11Vajra2t6vDqikVvSZIkSZIkSapT7733Hn/84x+56qqr+Oijj5hvvvnYbbfdWGuttejVq1fV4dUli96SJEmSJEmSVGfGjh3L1VdfzWWXXcb777/PXHPNxT777MN6661Hnz59qg6vrln0liRJkiRJkqQ6MW7cOP785z9z0UUXMXr0aGaddVa+973vsckmmzDjjDNWHV5DsOgtSZIkSZIkSRWbOHEiN998M+effz6vvfYa/fr1Y5dddmHLLbdklllmqTq8hmLRW9J0M++88wIwYsSIagORNN2NGjWq6hAk9QDHdql1OLZLUs+ZNGkSf//73znnnHN48cUX6dOnD1tvvTXbbbcds88+e9XhNSSL3pIkSZIkSZLUwzo6OrjnnnsYNmwYTz75JO3t7Wy00UbstNNODBgwoOrwGppFb0mSJEmSJEnqQQ8//DBnn302I0eOpK2tjUGDBrHbbrsx//zzVx1aU7DoLUmSJEmSJEk94IknnmDYsGHcc889AKy66qrsvvvuLLbYYhVH1lwsekuSJEmSJEnSdPT8889z7rnncvvttwOwwgorsMcee/DlL3+54siak0VvSZIkSZIkSZoO3n77bf7whz9w8803M2nSJJZaain22GMPVlxxxapDa2oWvSVJkiRJkiSpm7399tvsv//+vPTSSyy88MIMHjyY1VZbjba2tqpDa3oWvSVJkiRJkiSpG7377rsceOCBvPTSS2yzzTbsueee9OrVq+qwWoZFb0mSJEmSJEnqJu+//z4HH3wwzz77LJttthl77723s7t7WHvVAUiSJEmSJElSMxg7diyHHXYYTzzxBOuttx4//OEPLXhXwKK3JEmSJEmSJE2jcePGccQRRzBy5Ei+/e1vc8ABB9Debvm1Cv5bl/T/2rv7IK3rgt/jn122JURFEQUxvMGHrowkLC3zhGLKnVMO40ymJIqg6FjpzGGKYeQ2HSDhXtntETynYEGJp5SRtEGtHGRCcbJ15GiU13jSGhN38hHzoAK71/kju6c6Z/IBrv3t/ni9ZnaGa5fZ72cYZi54z5cfAAAAAOyFPXv2ZM6cOXnkkUdy2mmnZfbs2Z7hXSDRGwAAAADgPerq6sr8+fOzZcuWnHzyybnhhhvS1OS/UiySX30AYK8NGzYsmzZtKnoGAABAj+ru7k5ra2vuv//+nHjiiZk7d26am5uLnrXfc9MbAAAAAOBdqtVqWbRoUe69995UKpUsWLAgAwYMKHoWcdMbAAAAAOjDKpXKoCRrk/RL8n8ef/zxut+2rtVqWbJkSdavX59jjjkmN910UwYOHFjXM3nn3PQGAAAAAPqyyUm+Va1W/z1J5+bNm+t+4MqVK7NmzZqMGDEiCxcuzMEHH1z3M3nn3PQGAAAAAPqsarV689+9PPywww6ryznbt29PS0tLfvOb36S7uztDhgxJW1tbBg8eXJfzeO9EbwAAAACgz6tUKp9KcujYsWPr8v1bWlry2GOP/dfrIUOG5PDDD6/LWewdjzcBAAAAAPq0SqUyOMn3k1xWrzO2bdv2D6+ffPLJeh3FXhK9AQAAAIA+q1KpNCe5Pcm11Wr1j/U6Z/To0f/wuqmpKS+99FK9jmMviN4AAAAAQF92eZKPJfmPSqWy6e67767LIbNmzcqYMWPSr1+/HHHEEXnzzTczc+bM7Nixoy7n8d411Gq1Hj90/PjxPX8o0OM2bdpU9AQAAOA96OzszKRJk4qeAfSATZs2NRS9oQ7q3h5rtVq+//3vZ/369alUKmlra8vAgQPrfWxR+tzvETe9AQAAAADehYaGhlx99dU555xzUq1Wc+211+b1118vehZvEb0BAAAAAN6lxsbGfP3rX8+ZZ56Zxx9/PNdff3127dpV9CySNBU9AADo+/wTaNg/eHQZAMA/6tevX2bPnp0333wzW7ZsyZw5czJnzpw0NcmuRXLTGwAAAADgPWpqasoNN9yQk08+OVu2bMn8+fPT1dVV9Kz9mugNAAAAALAXmpubM3fu3Jx44om5//7709ramu7u7qJn7bdEbwAAAACAvTRgwIDMnz8/lUol9957bxYtWpRarVb0rP2S6A0AAAAAsA8ceOCBaWlpyahRo7J+/fosXbpU+C6A6A0AAAAAsI8MGjQora2tGTFiRFavXp2VK1cWPWm/I3oDAAAAAOxDgwcPTmtra4YOHZply5bl+eefL3rSfkX0BgAAAADYx4444oiceuqpSZLXXnut4DX7F9EbAAAAAIDSEL0BAAAAACgN0RsAAAAAgNIQvQEAAAAAKA3RGwAAAACA0hC9AQAAAAAoDdEbAAAAAIDSEL0BAAAAACgN0RsAAAAAgNIQvQEAAAAAKA3RGwAAAACgjv7whz8UPWG/InoDAAAAANTBcccdlySZO3duZs6cmWq1WvCi/UNT0QMAAAAAAMro3HPPzbHHHptly5alo6MjHR0dGTduXC677LKMHDmy6HmlJXoDAAAAANTJCSeckIULF+bRRx/N0qVLs3nz5jz44IOZMGFCLr300hx55JFFTywdjzcBAAAAAKizk046KYsWLcqNN96YkSNH5mc/+1mmTJmS7373u3nxxReLnlcqojcAAAAAQA9oaGjIaaedliVLluS6667L0KFD85Of/CSTJ0/OD3/4w7z66qtFTywFjzcB6qazszNJMmnSpIKXAPW0du3aoicAPcR7O+wfvLcD1F9jY2POOuusnHHGGbn33ntz6623Zs2aNbnrrrty4YUX5vzzz8+AAQOKntlnuekNAAAAAFCApqamnHvuuVm5cmW+/OUvp1+/flm2bFkuuuiirFu3Lrt27Sp6Yp8kegMAAAAAFKh///654IILsnr16kydOjW7du3K4sWLc8kll2TDhg3p6uoqemKfInoDAAAAAPQCAwcOzKWXXprVq1fnwgsvzCuvvJLW1tZMnTo1GzduTHd3d9ET+wTRGwAAAACgFxk0aFCuuuqqrFq1KhMnTsxzzz2XefPm5corr8xDDz2UWq1W9MReTfQGAAAAAOiFhgwZkhkzZmTFihWZMGFCnnrqqcyePTvXXHNNtm7dWvS8Xkv0BgAAAADoxYYPH57Zs2envb09n/70p7Nt27bMmDEjM2fOTLVaLXperyN6AwAAAAD0AaNGjcq8efNy88035+Mf/3g6Ojry1a9+Na+++mrR03oV0RsAAAAAoA854YQT0tramjPOOCNdXV3ZuXNn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\n",
      "text/plain": [
       "<Figure size 1800x648 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化呈现 No.313 样本 中属性中属性值存在空值的属性的分布\n",
    "msno.matrix(raw_313[raw_313_dummy_columns].replace(0, np.nan), figsize=(25, 9), fontsize=12, labels=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>S-ZORB.FT_1204.PV</th>\n",
       "      <th>S-ZORB.FC_2432.DACA</th>\n",
       "      <th>S-ZORB.FT_2431.DACA</th>\n",
       "      <th>S-ZORB.FC_2432.PIDA.SP</th>\n",
       "      <th>S-ZORB.FT_1204.DACA.PV</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>D-106热氮气流量</th>\n",
       "      <th>0</th>\n",
       "      <th>3.0步骤FIC2432.SP</th>\n",
       "      <th>D-121含硫污水排量</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>38.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>34.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>38.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>49.707433</td>\n",
       "      <td>55.025050</td>\n",
       "      <td>255.479771</td>\n",
       "      <td>55.977408</td>\n",
       "      <td>49.707433</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>8.341846</td>\n",
       "      <td>25.134146</td>\n",
       "      <td>234.464315</td>\n",
       "      <td>25.826184</td>\n",
       "      <td>8.341846</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>6.597014</td>\n",
       "      <td>0.488710</td>\n",
       "      <td>3.981225</td>\n",
       "      <td>0.177480</td>\n",
       "      <td>6.597014</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>46.641427</td>\n",
       "      <td>38.959682</td>\n",
       "      <td>90.305070</td>\n",
       "      <td>39.000000</td>\n",
       "      <td>46.641427</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>51.932390</td>\n",
       "      <td>68.763040</td>\n",
       "      <td>197.265750</td>\n",
       "      <td>69.000000</td>\n",
       "      <td>51.932390</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>53.980428</td>\n",
       "      <td>74.201170</td>\n",
       "      <td>333.157850</td>\n",
       "      <td>79.000000</td>\n",
       "      <td>53.980428</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>57.424220</td>\n",
       "      <td>80.166200</td>\n",
       "      <td>937.010600</td>\n",
       "      <td>79.000000</td>\n",
       "      <td>57.424220</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      S-ZORB.FT_1204.PV S-ZORB.FC_2432.DACA S-ZORB.FT_2431.DACA  \\\n",
       "                      0          D-106热氮气流量                   0   \n",
       "count         38.000000           24.000000           34.000000   \n",
       "mean          49.707433           55.025050          255.479771   \n",
       "std            8.341846           25.134146          234.464315   \n",
       "min            6.597014            0.488710            3.981225   \n",
       "25%           46.641427           38.959682           90.305070   \n",
       "50%           51.932390           68.763040          197.265750   \n",
       "75%           53.980428           74.201170          333.157850   \n",
       "max           57.424220           80.166200          937.010600   \n",
       "\n",
       "      S-ZORB.FC_2432.PIDA.SP S-ZORB.FT_1204.DACA.PV  \n",
       "             3.0步骤FIC2432.SP            D-121含硫污水排量  \n",
       "count              24.000000              38.000000  \n",
       "mean               55.977408              49.707433  \n",
       "std                25.826184               8.341846  \n",
       "min                 0.177480               6.597014  \n",
       "25%                39.000000              46.641427  \n",
       "50%                69.000000              51.932390  \n",
       "75%                79.000000              53.980428  \n",
       "max                79.000000              57.424220  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 对 No.313 样本中 存在属性值缺失的 属性进行统计学描述\n",
    "dummy_raw_313 = raw_313[raw_313_dummy_columns].replace(0, np.NaN)\n",
    "dummy_raw_313.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "No.313 样本数据 修正 属性值个数 => 214\n"
     ]
    }
   ],
   "source": [
    "# 依据 拉依达准则 对 No.313 样本进行属性值数据修正\n",
    "raw_313_filter = raw_313.drop(raw_313[raw_313_delete_columns], axis=1).replace(0, np.NaN)\n",
    "raw_313_filter_describe = raw_313_filter.describe()\n",
    "fix_count = 0\n",
    "for (code_name, i18n_name) in raw_313_filter.keys()[2:]:\n",
    "    norm_test = stats.kstest(raw_313_filter[(code_name, i18n_name)], 'norm', (raw_313_filter_describe.loc['mean', (code_name, i18n_name)], raw_313_filter_describe.loc['std', (code_name, i18n_name)]))\n",
    "    if norm_test.pvalue > 0.05:\n",
    "        temp_data = raw_313_filter[(code_name, i18n_name)][np.abs(raw_313_filter[(code_name, i18n_name)] - raw_313_filter_describe.loc['mean', (code_name, i18n_name)]) <= 3 * raw_313_filter_describe.loc['std', (code_name, i18n_name)]]\n",
    "        if sample_313[(code_name, i18n_name)] != round(temp_data.mean(), 7):\n",
    "            # print(f\"{'='*10} code_name: {(code_name, i18n_name)} {'='*10}\")\n",
    "            sample_313[(code_name, i18n_name)] = round(temp_data.mean(), 7)\n",
    "            # print(f\"样本数据 修正 => {sample_313[(code_name, i18n_name)]}\")\n",
    "            fix_count += 1\n",
    "            # print(f\"{'='*40}\")\n",
    "print(f\"No.313 样本数据 修正 属性值个数 => {fix_count}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stored 'sample_285' (Series)\n",
      "Stored 'sample_313' (Series)\n"
     ]
    }
   ],
   "source": [
    "%store sample_285\n",
    "%store sample_313"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python(chenhao)",
   "language": "python",
   "name": "venv"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {},
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
